package JZ_LC;

import java.util.HashSet;

/**
 * 找出数组中任意一个重复的数字。长度为n的数组nums里的所有数字都在 0～n-1 的范围内。
 * 思路：如果没有重复数字，那么正常排序后，数字i应该在下标为i的位置，所以思路是重头扫描数组，遇到下标为i的数字如果不是i的话，（假设为m),那么我们就拿与下标m的数字交换。在交换过程中，如果有重复的数字发生，那么终止返回ture
 */
public class T_03_数组中的重复数字 {
    //原地（面试一般考察原地）
    public int findRepeatNumber(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            while (nums[i] != i) {
                if (nums[i] == nums[nums[i]]) {
                    return nums[i];
                }
                int temp = nums[i];
                nums[i] = nums[temp];
                nums[temp] = temp;
            }
        }
        return -1;
    }

    //非原地（hashSet）
    public int findRepeatNumber2(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        int res = -1;
        for (int n : nums) {
            if (!set.add(n)) {
                res = n;
                break;
            }
        }
        return res;
    }


    public static void main(String[] args) {
        T_03_数组中的重复数字 t = new T_03_数组中的重复数字();
        int[] nums = {2, 2, 3, 3};
        int res = t.findRepeatNumber(nums);
        System.out.println(res);
    }
}
